package com.frame.library.http;

import android.content.Context;

import com.google.gson.Gson;
import com.tom.baselibrary.http.EngineCallback;
import com.tom.baselibrary.http.HttpUtils;

import java.util.Map;

/**
 * Added by Tom on 2024/06/28.
 * 带特定业务逻辑的Callback，只实现onPrepareExecute 一个方法。
 */
public abstract class HttpCallback<T> implements EngineCallback {

    @Override
    public void onPrepareExecute(Context context, Map<String, Object> params) {
        // 针对某app，添加公用参数。与项目业务逻辑有关
        // 公共必需要的参数。
        params.put("app_name", "joke_essay");
        params.put("version_name", "5.3.1");
        params.put("ac", "wifi");
        params.put("device_id", "456456456");
        params.put("device_brand", "XiaoMi");
        params.put("update_version_code", "5710");
        params.put("manifest_version_code", "570");
        params.put("longitude", "113.000366");
        params.put("latitude", "28.171377");
        params.put("device_platform", "android");

        onPrepareExecute(); // 显示进度条
    }

    // 方法开始执行了。方法透传，让UI显示进度条。
    public void onPrepareExecute() {
        // 空方法，可选择复写
    }

    // 覆盖父类的方法。每次成功后，都会回调的方法。
    @Override
    public void onSuccess(String result) {
        Gson gson = new Gson();
        // 要拿到自己泛型T上面的 class
        // 成功：data:{"name":"Tom"}    失败：data:"请求失败"  ，可以用原生的解析json。
        // HttpUtils.analysisClazzInfo(), 拿到类HttpCallback 的泛型信息。
        // T listResult = gson.fromJson(result, DiscoverListResult.class);
        // 下面获取泛型上面的 T class，网络请求的时候可以直接传<DiscoverListResult>
        T objResult = (T) gson.fromJson(result, HttpUtils.analysisClazzInfo(this));
        onSuccess(objResult); // 回调抽象方法
    }

    // 真正的返回Result T, 返回可以直接操作的对象.
    public abstract void onSuccess(T result);
}
